package com.qq.网络编程.TCP11;


import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.Socket;

/*
	TCP协议：
	它是一种面向连接的可靠通信协议，使用TCP协议，必须双方先建立连接。
	TCP主要有三个步骤实现可靠传输：三次握手建立连接，传输数据进行确认，四次挥手断开连接。
	传输前，采用“三次握手”方式建立连接，所以是可靠的 。
	在连接中可进行大数据量的传输 。
	连接、发送数据都需要确认，且传输完毕后，还需释放已建立的连接，通信效率较低（相对而言）
	最终目的：要保证在不可靠的信道上实现可靠的传输。
	
	TCP协议通信场景：
	对信息安全要求较高的场景，例如：文件下载、支付、网页等数据通信。
	
	可靠连接：确定[通信双方]，[收发消息]都是正常无问题的。（全双工）
	TCP三次握手建立可靠连接：      
	1.客户端向服务器发出连接请求，等待服务器确认。————服务端确认自己的收信能力和客户端的发信能力
	2.服务器向客户端返回一个响应，告诉客户端收到了请求。————客户端已确认双方的收发能力
	3.客户端向服务器再次发出确认信息，连接建立。————————服务端确认双方收发能力后连接建立
	
	TCP数据传输：传输数据会进行确认，以确保数据传输的可靠性：

	TCP四次挥手断开连接：
	1.客户端向服务器发出断开连接请求
	2.服务器向客户端返回一个响应表示收到客户端取消请求
	     服务器将最后的数据处理完毕再到下一步
	3.服务器向客户端发出确认断开信息（可能包含没发完的数据）
    4.客户端再次发送确认消息，连接取消（数据收完了）
    4.客户端再次发送确认消息，连接取消
	
	注意：在java中只要是使用java.net.Socket类实现通信，底层即是使用了TCP协议
		在java中网络通信技术都在net包下
	
	Socket构造器
	public Socket(String host , int port)	创建发送端的Socket对象与服务端连接，参数为服务端程序的ip和端口。
	
	Socket类成员方法
​	OutputStream getOutputStream()	获得字节输出流对象
	InputStream getInputStream()	获得字节输入流对象
	getRemoteSocketAddress()		获取发送端的IP

	长连接：
	一旦客户端登陆上服务器，其与服务器之间的连接就不关闭，
	直到客户端退出登陆或网络出现故障再关闭管道，有利于提高效率。
	
	短连接：
	短连接是客户端每发一个请求就与服务器建立一个连接，
	交易完成后关闭连接，这种技术实现比长连接简单。
	
	
   目标：完成Socket网络编程入门案例的客户端开发，实现1发1收(短连接)。
 */
public class Client_Test {
    public static void main(String[] args) {
        try {
            System.out.println("====客户端启动===");
            // 1、创建Socket通信管道请求服务端的连接
            // public Socket(String host, int port)//
            // 参数一：服务端的IP地址
            // 参数二：服务端的端口
            Socket socket = new Socket("127.0.0.1", 7777);//连接不上服务器将报错
            //localhost和127.0.0.1
            //192.168.155.1和InetAddress.getLocalHost().getHostAddress()
            //四种都可以作为本机地址
            
            // 2、从socket通信管道中得到一个字节输出流 负责发送数据到管道
            OutputStream os = socket.getOutputStream();

            // 3、把低级的字节流包装成数据流
            DataOutputStream ds = new DataOutputStream(os);
            
            ds.writeUTF("我是TCP的客户端，我已经与你对接，并发出邀请：约吗？");// 数据输出流更适合通信
            
			os.close();//没有结束标志，也不会报错
			socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
}
